.SILENT:

# ESTE ES EL MAKEFILE PARA EL HASH. 
# DEBE EJECUTARSE CON EL COMANDO MAKE. PARA VOLVER EL DIRECTORIO A SU ESTADO ORIGINAL
# UTILIZAR EL COMANDO MAKE CLOSE.
# EN CASO DE QUERER COMPILAR EN MODO SILENCIOSO, EJECUTAR MAKE SILENCE

#COMPILADOR POR DEFAULT
CC=gcc
# DIRECTIVAS DEL COMPILADOR
CFLAGS=-g -Wall -std=c99 -pedantic
# NOMBRE DEL PROGRAMA PRICIPAL
EXEC=prueba_abb_avl
# BIBLIOTECAS PARA EL PROGRAMA PRINCIPAL
SRC=$(wildcard *.c)
# CODIGO OBJETO DE LAS BIBLIOTECAS DEL PROGRAMA PRINCIPAL
OBJS= abb_avl.o $(EXEC).o
# CODIGO OBJETO DE LAS DEPENDECIAS EXTERNAS
LIBS= ../pila/pila.o
# DIRECTORIO DE LAS HEADERS DE LAS DEPENDENCIAS EXTERNAS 
HEADERS_DIR= ../pila/*.h
# HEADERS DE LAS DEPENDENCIAS EXTERNAS 
HEADERS=pila.h
# DIRECTIVAS DEL MEM CHECK
VFLAGS= valgrind --leak-check=full --show-reachable=yes --track-origins=yes

# DEFAULT
all: prepare $(EXEC)

# SILENT DEFAULT
silent: sprepare s$(EXEC) 

# COMPILA SOLAMENTE EL CODIGO OBJETO
objects: localClean
	cp $(HEADERS_DIR) ./
	$(CC) $(CFLAGS) -c $(SRC) -lm
	rm -f $(HEADERS)
	
# Limpieza Local
localClean:
	rm -f *.o $(EXEC)

# COMPILA DEPENDECIAS EXTERNAS
prepare:
	echo -n Compilando dependencias.  
	cd ../pila; make silent
	echo -n ..
	cp $(HEADERS_DIR) ./
	echo OK
	

# COMPILA BIBLIOTECAS
%.o: %.c
	echo -n Compilando biblioteca a testear...
	$(CC) $(CFLAGS) -c $< 
	echo OK
	
# CONSTRUYE EL PROGRAMA PRINCIPAL
$(EXEC): $(OBJS)
	echo -n Construyendo pruebas...
	$(CC) $(CFLAGS) $(LIBS) $(OBJS) -o $(EXEC)
	echo OK

# LIMPIA EL DIRECTORIO BASE
clean: $(SRC)
	rm -f *.o $(EXEC)

# CORRE EL PROGRAMA PRINCIPAL
run:
	echo Corriendo pruebas...
	./$(EXEC)

# CORRE PRUEBAS DE MEMORIA SOBRE EL PROGRAMA PRINCIPAL
test:
	echo Corriendo pruebas en modo memCheck...
	$(VFLAGS) ./$(EXEC)

# LIMPIA LOS DIRECTORIOS DE LAS DEPENDENCIAS EXTERNAS
close: clean
	rm -f $(HEADERS) *.o
	cd ../pila; make clean
	
# SILENT PREPARE
sprepare: clean
	cd ../pila; make silent
	cp $(HEADERS_DIR) ./

# SILENT %.o
s$(OBJS):
	$(CC) $(CFLAGS) -c $(SRC)

# SILENT $(EXEC)
s$(EXEC): s$(OBJS)
	$(CC) $(CFLAGS) $(LIBS) $(OBJS) $(HEADERS) -o $(EXEC)

# Corre time test sobre el programa principal	
time:
	time -f "Real time: %e s\nCPU-seconds (in user mode): %U s\nCPU-seconds (in kernel mode): %S s" ./$(EXEC) 

# Corre time test sobre las pruebas del programa principal
timeMem:
	time -f "Real time: %e s\nCPU-seconds (in user mode): %U s\nCPU-seconds (in kernel mode): %S s" $(VFLAGS) ./$(EXEC) 
	
